<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <h1>this指针</h1>
    <p>普通函数里面，this指向的是最后调用函数的对象。</p>
    <script>
        var name = "windowsName";

        function a() {
            var name = "Cherry";
            console.log(this.name);   // "windowsName"
            console.log("inner:" , this); // inner: window
        }
        // 此时没有指明a的调用对象，那么就是使用全局的window对象调用。
        // 所以a()内部的this指向，指向的是调用方法的对象 -> window
        a();
        console.log("outer:" , this)   // outer: window


        var MyPlane = function (x, y, imgSrc, speed) {
            this.x = x;
            this.y = y;
            this.imgSrc = imgSrc;
            this.speed = speed;
            console.log("this == window",this == window); // true
            console.log("this.x",this.x) // undefined
        }
        // 没有使用new，不是按照构造函数方式调用，所以也是全局调用。
        // 函数内部this指向的window。
        MyPlane();

        let obj = {
            x: 10,
            fn() {
                console.log(this); 
                console.log(this.x); 
            }
        }

        // 函数内部this指向的是obj
        obj.fn();

        let fn = obj.fn;
        // 全局调用，this指向的是window
        fn();

        let obj2 = {
            x: 10,
            // 如果想让fn里面的this永久指向window，如何做？
            // 箭头函数，自身没有this指向，他会指向最先调用函数的对象。
            fn: () => {
                console.log("obj2.fn2().this",this); 
                console.log("obj2.fn2().this.x",this.x); 
            }
        }

        obj2.fn();
        let fn2 = obj2.fn;
        fn2();

    </script>
</body>

</html>